﻿Imports Commander_Wars.Spieletools
''' <summary>
''' You're fighting you're loosing here.=D
''' </summary>
''' <remarks></remarks>
Public Class KISchwer
    Inherits ObjektKI
    Dim VirtuelBattleMap As VirtuelMap
    Const Ignorierschaden As Single = 5
    ''' <summary>
    ''' The greater this value is the lower is the influence of other Units deffending our Troops.
    ''' </summary>
    ''' <remarks></remarks>
    Const OwnDeffence As Integer = 4
    Public Sub New(ByVal Spieler As ObjektSpieler)
        MyBase.New(Spieler, 0, 1, 0.5#, Besetzungsprioritäten.MeisteEinheiten, GeldTPAngriffsModus.NurGeld, 10, CSng(1 / 3), 5, CSng(1 / 3))


        StartNeuerKIThreat()
    End Sub
    Protected Overrides Function CalculateRealZiel(ByRef WSS As Wegsuchsystem, ByVal Ziel As System.Drawing.Point, ByVal Einheit As ObjektEinheit, ByRef Opfer As System.Drawing.Point) As System.Drawing.Point

    End Function

    Public Overrides Sub KISchleife()

    End Sub

    
    Protected Overrides Sub Schlachtwechsel(ByVal Sortieren As ObjektKI.EinheitenSortierKriterien)
        MyBase.Schlachtwechsel(Sortieren)
        VirtuelBattleMap = New VirtuelMap(Schlachtfeld)
    End Sub
    Private Class VirtuelUnit
        Public Sub New(ByVal Unit As ObjektEinheit, ByVal ID As Integer)
            X = Unit.X
            Y = Unit.Y
            HP = Unit.getKP
            UnitID = Unit.EinheitenID
            Weapon1 = Unit.Waffe1
            Weapon2 = Unit.Waffe2
            ThisID = ID
            UnitCosts = Unit.GetSpieler.Teurungsrate(Unit.EinheitenID, Unit.X, Unit.Y) * Unit.Kosten * HP / 10
            Team = Unit.GetSpieler.Team
            Type = Typs.Unit
        End Sub
        Public Sub New(ByVal Building As ObjektGebäude, ByVal ID As Integer)
            X = Building.Rechteck.X
            Y = Building.Rechteck.Y
            HP = Building.KP
            UnitID = Building.GebäudeID
            UnitCosts = Building.Schaden
            Team = Building.GetSpieler.Team
            Type = Typs.Building
        End Sub
        Enum Typs
            Unit
            Building
        End Enum
        Public Type As Typs
        Public X, Y As Integer
        Public HP As Integer
        Public UnitID As String
        Public Weapon1, Weapon2 As String
        Public ThisID As Integer
        Public UnitCosts As Integer
        Public Team As Char
    End Class
    Private Class VirtuelMap
        Dim UnitsBuildings(,) As List(Of VirtuelUnit)
        Public Sub New(ByVal Battlefield As Integer)
            Dim MomID As Integer = Integer.MinValue
            ReDim UnitsBuildings(Objektverwalter.Spielfeld.Breite - 1, Objektverwalter.Spielfeld.Höhe - 1)
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(X, Y, Battlefield).Gebäude
                    'Add Buildings
                    If G IsNot Nothing Then
                        If G.Schaden <> 0 Then
                            If Not TypeOf G Is GebäudeVerweis Then
                                Dim Targets As Point() = G.GetAngriffsFelder
                                Dim VG As New VirtuelUnit(G, MomID)
                                For Each Target In Targets
                                    If UnitsBuildings(Target.X, Target.Y) Is Nothing Then
                                        UnitsBuildings(Target.X, Target.Y) = New List(Of VirtuelUnit)
                                        UnitsBuildings(X, Y).Add(VG)
                                    Else
                                        UnitsBuildings(X, Y).Add(VG)
                                    End If
                                Next
                                MomID += 1
                            End If
                        End If
                    End If
                    Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, Battlefield)

                    If E IsNot Nothing Then
                        Dim VE As New VirtuelUnit(E, MomID)
                        If E.Waffe1 <> "Keine" Or E.Waffe2 <> "Keine" Then
                            Dim AddedFields As New List(Of Point)
                            'Wir zeigen den Nahkampf an
                            'Wir haben eine Nahkampfeinheit
                            Dim WSS As Wegsuchsystem
                            Dim Bewegunspunkte As Integer = Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).GetMovementRange
                            If Bewegunspunkte <= Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Treibstoff Then
                                WSS = New Wegsuchsystem(Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht), X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht, Bewegunspunkte)
                            ElseIf Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Treibstoff = -1 Then
                                WSS = New Wegsuchsystem(Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht), X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht, Bewegunspunkte)
                            Else
                                WSS = New Wegsuchsystem(Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht), X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht, Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Treibstoff)
                            End If
                            Dim MaximaleReichweite As Integer = Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).MaximaleReichweite
                            Dim MinimaleReichweite As Integer = Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).MinimaleReichweite
                            Dim Kreis(,) As Integer = Kreisfunktion(MaximaleReichweite)

                            For Y1 = 0 To Objektverwalter.Spielfeld.Höhe - 1
                                For X1 = 0 To Objektverwalter.Spielfeld.Breite - 1
                                    Dim Kosten As Integer = WSS.getBewegungspunktekosten(X1, Y1)
                                    If Kosten >= 0 And Kosten <= Bewegunspunkte Then
                                        If Kosten = 0 Then
                                            For X2 = 0 To MaximaleReichweite * 2
                                                For Y2 = 0 To MaximaleReichweite * 2
                                                    If Kreis(X2, Y2) >= MinimaleReichweite Then
                                                        If Objektverwalter.Spielfeld.OnMap(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2) Then
                                                            If Not AddedFields.Contains(New Point(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2)) Then
                                                                If UnitsBuildings(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2) Is Nothing Then
                                                                    UnitsBuildings(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2) = New List(Of VirtuelUnit)
                                                                    UnitsBuildings(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2).Add(VE)
                                                                Else
                                                                    UnitsBuildings(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2).Add(VE)
                                                                End If
                                                                AddedFields.Add(New Point(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2))
                                                            End If
                                                        End If
                                                    End If
                                                Next
                                            Next
                                            If E.Waffe1 <> "Keine" Or E.MinimaleReichweite = 1 Then
                                                If Not AddedFields.Contains(New Point(X1, Y1)) Then
                                                    If UnitsBuildings(X1, Y1) Is Nothing Then
                                                        UnitsBuildings(X1, Y1) = New List(Of VirtuelUnit)
                                                        UnitsBuildings(X1, Y1).Add(VE)
                                                    Else
                                                        UnitsBuildings(X1, Y1).Add(VE)
                                                    End If
                                                    AddedFields.Add(New Point(X1, Y1))
                                                End If
                                            End If
                                        Else
                                            If E.CanIndirectMoveAndFire Then
                                                For X2 = 0 To MaximaleReichweite * 2
                                                    For Y2 = 0 To MaximaleReichweite * 2
                                                        If Objektverwalter.Spielfeld.OnMap(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2) Then
                                                            If Kreis(X2, Y2) >= MinimaleReichweite Then
                                                                If Not AddedFields.Contains(New Point(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2)) Then
                                                                    If UnitsBuildings(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2) Is Nothing Then
                                                                        UnitsBuildings(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2) = New List(Of VirtuelUnit)
                                                                        UnitsBuildings(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2).Add(VE)
                                                                    Else
                                                                        UnitsBuildings(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2).Add(VE)
                                                                    End If
                                                                    AddedFields.Add(New Point(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2))
                                                                End If
                                                            End If
                                                        End If
                                                    Next
                                                Next
                                            ElseIf E.Waffe1 <> "Keine" Or E.MinimaleReichweite = 1 Then
                                                If Not AddedFields.Contains(New Point(X1, Y1)) Then
                                                    If UnitsBuildings(X1, Y1) Is Nothing Then
                                                        UnitsBuildings(X1, Y1) = New List(Of VirtuelUnit)
                                                        UnitsBuildings(X1, Y1).Add(VE)
                                                    Else
                                                        UnitsBuildings(X1, Y1).Add(VE)
                                                    End If
                                                    AddedFields.Add(New Point(X1, Y1))
                                                End If
                                            End If
                                        End If
                                    ElseIf E.Waffe1 <> "Keine" Or E.MinimaleReichweite = 1 Then
                                        Dim X2 As Integer = X1
                                        Dim Y2 As Integer = Y1
                                        For I = 0 To 3
                                            Select Case I
                                                Case 0
                                                    X2 -= 1
                                                Case 1
                                                    X2 += 1
                                                    Y2 -= 1
                                                Case 2
                                                    X2 += 1
                                                    Y2 += 1
                                                Case 3
                                                    X2 -= 1
                                                    Y2 += 1
                                            End Select
                                            If X2 >= 0 And Y2 >= 0 And X2 < Objektverwalter.Spielfeld.Breite And Y2 < Objektverwalter.Spielfeld.Höhe Then
                                                Kosten = WSS.getBewegungspunktekosten(X2, Y2)
                                                If Kosten >= 0 And Kosten <= Bewegunspunkte Then
                                                    If Not AddedFields.Contains(New Point(X1, Y1)) Then
                                                        If UnitsBuildings(X1, Y1) Is Nothing Then
                                                            UnitsBuildings(X1, Y1) = New List(Of VirtuelUnit)
                                                            UnitsBuildings(X1, Y1).Add(VE)
                                                        Else
                                                            UnitsBuildings(X1, Y1).Add(VE)
                                                        End If
                                                        AddedFields.Add(New Point(X1, Y1))
                                                    End If
                                                    Exit For
                                                End If
                                            End If
                                        Next
                                    End If
                                Next
                            Next
                            MomID += 1
                        ElseIf E.Bewegungsart = MovementSorts.Höllium.ToString Then
                            Dim WSS As Wegsuchsystem
                            Dim Bewegunspunkte As Integer = Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).GetMovementRange
                            If Bewegunspunkte <= Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Treibstoff Then
                                WSS = New Wegsuchsystem(Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht), X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht, Bewegunspunkte)
                            ElseIf Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Treibstoff = -1 Then
                                WSS = New Wegsuchsystem(Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht), X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht, Bewegunspunkte)
                            Else
                                WSS = New Wegsuchsystem(Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht), X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht, Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Treibstoff)
                            End If
                            Dim MaximaleReichweite As Integer = Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).MaximaleReichweite
                            Dim MinimaleReichweite As Integer = Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).MinimaleReichweite
                            Dim Kreis(,) As Integer = Kreisfunktion(MaximaleReichweite)
                            For Y1 = 0 To Objektverwalter.Spielfeld.Höhe - 1
                                For X1 = 0 To Objektverwalter.Spielfeld.Breite - 1
                                    Dim Kosten As Integer = WSS.getBewegungspunktekosten(X1, Y1)
                                    If Kosten >= 0 And Kosten <= Bewegunspunkte Then
                                        If UnitsBuildings(X1, Y1) Is Nothing Then
                                            UnitsBuildings(X1, Y1) = New List(Of VirtuelUnit)
                                            UnitsBuildings(X1, Y1).Add(VE)
                                        Else
                                            UnitsBuildings(X1, Y1).Add(VE)
                                        End If
                                    End If
                                Next
                            Next
                        End If
                        MomID += 1
                    End If
                Next
            Next
        End Sub
        Public Sub UpdateField(ByVal X As Integer, ByVal Y As Integer)
            Dim U As List(Of VirtuelUnit) = UnitsBuildings(X, Y)
            Dim I As Integer = 0
            While I < U.Count
                If U(I).Type = VirtuelUnit.Typs.Building Then
                    If Objektverwalter.Spielfeld.Landschaften(U(I).X, U(I).Y, Schlachtfeld).Gebäude Is Nothing Then
                        U.RemoveAt(I)
                    Else
                        I += 1
                    End If
                Else
                    I += 1
                End If
            End While
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If UnitsBuildings(X, Y) IsNot Nothing Then
                        I = 0
                        While I < UnitsBuildings(X, Y).Count
                            For Each E In U
                                If E.Type = VirtuelUnit.Typs.Unit Then
                                    If UnitsBuildings(X, Y)(I).ThisID = E.ThisID Then
                                        UnitsBuildings(X, Y).RemoveAt(I)
                                    Else
                                        I += 1
                                    End If
                                End If
                            Next
                        End While
                    End If
                Next
            Next
            For Each VE In U
                If VE.Type = VirtuelUnit.Typs.Unit Then
                    Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(VE.X, VE.Y, Schlachtfeld)
                    If E.Waffe1 <> "Keine" Or E.Waffe2 <> "Keine" Then
                        Dim AddedFields As New List(Of Point)
                        'Wir zeigen den Nahkampf an
                        'Wir haben eine Nahkampfeinheit
                        Dim WSS As Wegsuchsystem
                        Dim Bewegunspunkte As Integer = Objektverwalter.Spielfeld.Einheiten(VE.X, VE.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).GetMovementRange
                        If Bewegunspunkte <= Objektverwalter.Spielfeld.Einheiten(VE.X, VE.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Treibstoff Then
                            WSS = New Wegsuchsystem(Objektverwalter.Spielfeld.Einheiten(VE.X, VE.Y, Objektverwalter.Spielfeld.MomentaneSchlacht), VE.X, VE.Y, Objektverwalter.Spielfeld.MomentaneSchlacht, Bewegunspunkte)
                        ElseIf Objektverwalter.Spielfeld.Einheiten(VE.X, VE.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Treibstoff = -1 Then
                            WSS = New Wegsuchsystem(Objektverwalter.Spielfeld.Einheiten(VE.X, VE.Y, Objektverwalter.Spielfeld.MomentaneSchlacht), VE.X, VE.Y, Objektverwalter.Spielfeld.MomentaneSchlacht, Bewegunspunkte)
                        Else
                            WSS = New Wegsuchsystem(Objektverwalter.Spielfeld.Einheiten(VE.X, VE.Y, Objektverwalter.Spielfeld.MomentaneSchlacht), VE.X, VE.Y, Objektverwalter.Spielfeld.MomentaneSchlacht, Objektverwalter.Spielfeld.Einheiten(X, Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Treibstoff)
                        End If
                        Dim MaximaleReichweite As Integer = Objektverwalter.Spielfeld.Einheiten(VE.X, VE.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).MaximaleReichweite
                        Dim MinimaleReichweite As Integer = Objektverwalter.Spielfeld.Einheiten(VE.X, VE.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).MinimaleReichweite
                        Dim Kreis(,) As Integer = Kreisfunktion(MaximaleReichweite)

                        For Y1 = 0 To Objektverwalter.Spielfeld.Höhe - 1
                            For X1 = 0 To Objektverwalter.Spielfeld.Breite - 1
                                Dim Kosten As Integer = WSS.getBewegungspunktekosten(X1, Y1)
                                If Kosten >= 0 And Kosten <= Bewegunspunkte Then
                                    If Kosten = 0 Then
                                        For X2 = 0 To MaximaleReichweite * 2
                                            For Y2 = 0 To MaximaleReichweite * 2
                                                If Kreis(X2, Y2) >= MinimaleReichweite Then
                                                    If Objektverwalter.Spielfeld.OnMap(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2) Then
                                                        If Not AddedFields.Contains(New Point(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2)) Then
                                                            If UnitsBuildings(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2) Is Nothing Then
                                                                UnitsBuildings(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2) = New List(Of VirtuelUnit)
                                                                UnitsBuildings(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2).Add(VE)
                                                            Else
                                                                UnitsBuildings(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2).Add(VE)
                                                            End If
                                                            AddedFields.Add(New Point(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2))
                                                        End If
                                                    End If
                                                End If
                                            Next
                                        Next
                                        If E.Waffe1 <> "Keine" Or E.MinimaleReichweite = 1 Then
                                            If Not AddedFields.Contains(New Point(X1, Y1)) Then
                                                If UnitsBuildings(X1, Y1) Is Nothing Then
                                                    UnitsBuildings(X1, Y1) = New List(Of VirtuelUnit)
                                                    UnitsBuildings(X1, Y1).Add(VE)
                                                Else
                                                    UnitsBuildings(X1, Y1).Add(VE)
                                                End If
                                                AddedFields.Add(New Point(X1, Y1))
                                            End If
                                        End If
                                    Else
                                        If E.CanIndirectMoveAndFire Then
                                            For X2 = 0 To MaximaleReichweite * 2
                                                For Y2 = 0 To MaximaleReichweite * 2
                                                    If Objektverwalter.Spielfeld.OnMap(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2) Then
                                                        If Kreis(X2, Y2) >= MinimaleReichweite Then
                                                            If Not AddedFields.Contains(New Point(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2)) Then
                                                                If UnitsBuildings(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2) Is Nothing Then
                                                                    UnitsBuildings(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2) = New List(Of VirtuelUnit)
                                                                    UnitsBuildings(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2).Add(VE)
                                                                Else
                                                                    UnitsBuildings(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2).Add(VE)
                                                                End If
                                                                AddedFields.Add(New Point(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2))
                                                            End If
                                                        End If
                                                    End If
                                                Next
                                            Next
                                        ElseIf E.Waffe1 <> "Keine" Or E.MinimaleReichweite = 1 Then
                                            If Not AddedFields.Contains(New Point(X1, Y1)) Then
                                                If UnitsBuildings(X1, Y1) Is Nothing Then
                                                    UnitsBuildings(X1, Y1) = New List(Of VirtuelUnit)
                                                    UnitsBuildings(X1, Y1).Add(VE)
                                                Else
                                                    UnitsBuildings(X1, Y1).Add(VE)
                                                End If
                                                AddedFields.Add(New Point(X1, Y1))
                                            End If
                                        End If
                                    End If
                                ElseIf E.Waffe1 <> "Keine" Or E.MinimaleReichweite = 1 Then
                                    Dim X2 As Integer = X1
                                    Dim Y2 As Integer = Y1
                                    For I = 0 To 3
                                        Select Case I
                                            Case 0
                                                X2 -= 1
                                            Case 1
                                                X2 += 1
                                                Y2 -= 1
                                            Case 2
                                                X2 += 1
                                                Y2 += 1
                                            Case 3
                                                X2 -= 1
                                                Y2 += 1
                                        End Select
                                        If X2 >= 0 And Y2 >= 0 And X2 < Objektverwalter.Spielfeld.Breite And Y2 < Objektverwalter.Spielfeld.Höhe Then
                                            Kosten = WSS.getBewegungspunktekosten(X2, Y2)
                                            If Kosten >= 0 And Kosten <= Bewegunspunkte Then
                                                If Not AddedFields.Contains(New Point(X1, Y1)) Then
                                                    If UnitsBuildings(X1, Y1) Is Nothing Then
                                                        UnitsBuildings(X1, Y1) = New List(Of VirtuelUnit)
                                                        UnitsBuildings(X1, Y1).Add(VE)
                                                    Else
                                                        UnitsBuildings(X1, Y1).Add(VE)
                                                    End If
                                                    AddedFields.Add(New Point(X1, Y1))
                                                End If
                                                Exit For
                                            End If
                                        End If
                                    Next

                                End If
                            Next
                        Next
                    ElseIf E.Bewegungsart = MovementSorts.Höllium.ToString Then
                        Dim WSS As Wegsuchsystem
                        Dim Bewegunspunkte As Integer = E.GetMovementRange
                        If Bewegunspunkte <= E.Treibstoff Then
                            WSS = New Wegsuchsystem(E, E.X, E.Y, Objektverwalter.Spielfeld.MomentaneSchlacht, Bewegunspunkte)
                        ElseIf E.Treibstoff = -1 Then
                            WSS = New Wegsuchsystem(E, E.X, E.Y, Objektverwalter.Spielfeld.MomentaneSchlacht, Bewegunspunkte)
                        Else
                            WSS = New Wegsuchsystem(E, E.X, E.Y, Objektverwalter.Spielfeld.MomentaneSchlacht, E.Treibstoff)
                        End If
                        Dim MaximaleReichweite As Integer = E.MaximaleReichweite
                        Dim MinimaleReichweite As Integer = E.MinimaleReichweite
                        Dim Kreis(,) As Integer = Kreisfunktion(MaximaleReichweite)
                        For Y1 = 0 To Objektverwalter.Spielfeld.Höhe - 1
                            For X1 = 0 To Objektverwalter.Spielfeld.Breite - 1
                                Dim Kosten As Integer = WSS.getBewegungspunktekosten(X1, Y1)
                                If Kosten >= 0 And Kosten <= Bewegunspunkte Then
                                    If UnitsBuildings(X1, Y1) Is Nothing Then
                                        UnitsBuildings(X1, Y1) = New List(Of VirtuelUnit)
                                        UnitsBuildings(X1, Y1).Add(VE)
                                    Else
                                        UnitsBuildings(X1, Y1).Add(VE)
                                    End If
                                End If
                            Next
                        Next
                    End If
                End If
            Next
        End Sub
        Public Sub UpdateList(ByVal U As List(Of VirtuelUnit))
            Dim I As Integer = 0
            While I < U.Count
                If U(I).Type = VirtuelUnit.Typs.Building Then
                    If Objektverwalter.Spielfeld.Landschaften(U(I).X, U(I).Y, Schlachtfeld).Gebäude Is Nothing Then
                        U.RemoveAt(I)
                    Else
                        I += 1
                    End If
                Else
                    I += 1
                End If
            End While
            For X = 0 To Objektverwalter.Spielfeld.Breite - 1
                For Y = 0 To Objektverwalter.Spielfeld.Höhe - 1
                    If UnitsBuildings(X, Y) IsNot Nothing Then
                        I = 0
                        While I < UnitsBuildings(X, Y).Count
                            For Each E In U
                                If E.Type = VirtuelUnit.Typs.Unit Then
                                    If UnitsBuildings(X, Y)(I).ThisID = E.ThisID Then
                                        UnitsBuildings(X, Y).RemoveAt(I)
                                    Else
                                        I += 1
                                    End If
                                End If
                            Next
                        End While
                    End If
                Next
            Next
            For Each VE In U
                If VE.Type = VirtuelUnit.Typs.Unit Then
                    Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(VE.X, VE.Y, Schlachtfeld)
                    If E.Waffe1 <> "Keine" Or E.Waffe2 <> "Keine" Then
                        Dim AddedFields As New List(Of Point)
                        'Wir zeigen den Nahkampf an
                        'Wir haben eine Nahkampfeinheit
                        Dim WSS As Wegsuchsystem
                        Dim Bewegunspunkte As Integer = Objektverwalter.Spielfeld.Einheiten(VE.X, VE.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).GetMovementRange
                        If Bewegunspunkte <= Objektverwalter.Spielfeld.Einheiten(VE.X, VE.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Treibstoff Then
                            WSS = New Wegsuchsystem(Objektverwalter.Spielfeld.Einheiten(VE.X, VE.Y, Objektverwalter.Spielfeld.MomentaneSchlacht), VE.X, VE.Y, Objektverwalter.Spielfeld.MomentaneSchlacht, Bewegunspunkte)
                        ElseIf Objektverwalter.Spielfeld.Einheiten(VE.X, VE.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Treibstoff = -1 Then
                            WSS = New Wegsuchsystem(Objektverwalter.Spielfeld.Einheiten(VE.X, VE.Y, Objektverwalter.Spielfeld.MomentaneSchlacht), VE.X, VE.Y, Objektverwalter.Spielfeld.MomentaneSchlacht, Bewegunspunkte)
                        Else
                            WSS = New Wegsuchsystem(Objektverwalter.Spielfeld.Einheiten(VE.X, VE.Y, Objektverwalter.Spielfeld.MomentaneSchlacht), VE.X, VE.Y, Objektverwalter.Spielfeld.MomentaneSchlacht, Objektverwalter.Spielfeld.Einheiten(VE.X, VE.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).Treibstoff)
                        End If
                        Dim MaximaleReichweite As Integer = Objektverwalter.Spielfeld.Einheiten(VE.X, VE.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).MaximaleReichweite
                        Dim MinimaleReichweite As Integer = Objektverwalter.Spielfeld.Einheiten(VE.X, VE.Y, Objektverwalter.Spielfeld.MomentaneSchlacht).MinimaleReichweite
                        Dim Kreis(,) As Integer = Kreisfunktion(MaximaleReichweite)

                        For Y1 = 0 To Objektverwalter.Spielfeld.Höhe - 1
                            For X1 = 0 To Objektverwalter.Spielfeld.Breite - 1
                                Dim Kosten As Integer = WSS.getBewegungspunktekosten(X1, Y1)
                                If Kosten >= 0 And Kosten <= Bewegunspunkte Then
                                    If Kosten = 0 Then
                                        For X2 = 0 To MaximaleReichweite * 2
                                            For Y2 = 0 To MaximaleReichweite * 2
                                                If Kreis(X2, Y2) >= MinimaleReichweite Then
                                                    If Objektverwalter.Spielfeld.OnMap(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2) Then
                                                        If Not AddedFields.Contains(New Point(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2)) Then
                                                            If UnitsBuildings(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2) Is Nothing Then
                                                                UnitsBuildings(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2) = New List(Of VirtuelUnit)
                                                                UnitsBuildings(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2).Add(VE)
                                                            Else
                                                                UnitsBuildings(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2).Add(VE)
                                                            End If
                                                            AddedFields.Add(New Point(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2))
                                                        End If
                                                    End If
                                                End If
                                            Next
                                        Next
                                        If E.Waffe1 <> "Keine" Or E.MinimaleReichweite = 1 Then
                                            If Not AddedFields.Contains(New Point(X1, Y1)) Then
                                                If UnitsBuildings(X1, Y1) Is Nothing Then
                                                    UnitsBuildings(X1, Y1) = New List(Of VirtuelUnit)
                                                    UnitsBuildings(X1, Y1).Add(VE)
                                                Else
                                                    UnitsBuildings(X1, Y1).Add(VE)
                                                End If
                                                AddedFields.Add(New Point(X1, Y1))
                                            End If
                                        End If
                                    Else
                                        If E.CanIndirectMoveAndFire Then
                                            For X2 = 0 To MaximaleReichweite * 2
                                                For Y2 = 0 To MaximaleReichweite * 2
                                                    If Objektverwalter.Spielfeld.OnMap(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2) Then
                                                        If Kreis(X2, Y2) >= MinimaleReichweite Then
                                                            If Not AddedFields.Contains(New Point(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2)) Then
                                                                If UnitsBuildings(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2) Is Nothing Then
                                                                    UnitsBuildings(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2) = New List(Of VirtuelUnit)
                                                                    UnitsBuildings(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2).Add(VE)
                                                                Else
                                                                    UnitsBuildings(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2).Add(VE)
                                                                End If
                                                                AddedFields.Add(New Point(X1 - MaximaleReichweite + X2, Y1 - MaximaleReichweite + Y2))
                                                            End If
                                                        End If
                                                    End If
                                                Next
                                            Next
                                        ElseIf E.Waffe1 <> "Keine" Or E.MinimaleReichweite = 1 Then
                                            If Not AddedFields.Contains(New Point(X1, Y1)) Then
                                                If UnitsBuildings(X1, Y1) Is Nothing Then
                                                    UnitsBuildings(X1, Y1) = New List(Of VirtuelUnit)
                                                    UnitsBuildings(X1, Y1).Add(VE)
                                                Else
                                                    UnitsBuildings(X1, Y1).Add(VE)
                                                End If
                                                AddedFields.Add(New Point(X1, Y1))
                                            End If
                                        End If
                                    End If
                                ElseIf E.Waffe1 <> "Keine" Or E.MinimaleReichweite = 1 Then
                                    Dim X2 As Integer = X1
                                    Dim Y2 As Integer = Y1
                                    For I = 0 To 3
                                        Select Case I
                                            Case 0
                                                X2 -= 1
                                            Case 1
                                                X2 += 1
                                                Y2 -= 1
                                            Case 2
                                                X2 += 1
                                                Y2 += 1
                                            Case 3
                                                X2 -= 1
                                                Y2 += 1
                                        End Select
                                        If X2 >= 0 And Y2 >= 0 And X2 < Objektverwalter.Spielfeld.Breite And Y2 < Objektverwalter.Spielfeld.Höhe Then
                                            Kosten = WSS.getBewegungspunktekosten(X2, Y2)
                                            If Kosten >= 0 And Kosten <= Bewegunspunkte Then
                                                If Not AddedFields.Contains(New Point(X1, Y1)) Then
                                                    If UnitsBuildings(X1, Y1) Is Nothing Then
                                                        UnitsBuildings(X1, Y1) = New List(Of VirtuelUnit)
                                                        UnitsBuildings(X1, Y1).Add(VE)
                                                    Else
                                                        UnitsBuildings(X1, Y1).Add(VE)
                                                    End If
                                                    AddedFields.Add(New Point(X1, Y1))
                                                End If
                                                Exit For
                                            End If
                                        End If
                                    Next
                                End If
                            Next
                        Next
                    ElseIf E.Bewegungsart = MovementSorts.Höllium.ToString Then
                        Dim WSS As Wegsuchsystem
                        Dim Bewegunspunkte As Integer = E.GetMovementRange
                        If Bewegunspunkte <= E.Treibstoff Then
                            WSS = New Wegsuchsystem(E, E.X, E.Y, Objektverwalter.Spielfeld.MomentaneSchlacht, Bewegunspunkte)
                        ElseIf E.Treibstoff = -1 Then
                            WSS = New Wegsuchsystem(E, E.X, E.Y, Objektverwalter.Spielfeld.MomentaneSchlacht, Bewegunspunkte)
                        Else
                            WSS = New Wegsuchsystem(E, E.X, E.Y, Objektverwalter.Spielfeld.MomentaneSchlacht, E.Treibstoff)
                        End If
                        Dim MaximaleReichweite As Integer = E.MaximaleReichweite
                        Dim MinimaleReichweite As Integer = E.MinimaleReichweite
                        Dim Kreis(,) As Integer = Kreisfunktion(MaximaleReichweite)
                        For Y1 = 0 To Objektverwalter.Spielfeld.Höhe - 1
                            For X1 = 0 To Objektverwalter.Spielfeld.Breite - 1
                                Dim Kosten As Integer = WSS.getBewegungspunktekosten(X1, Y1)
                                If Kosten >= 0 And Kosten <= Bewegunspunkte Then
                                    If UnitsBuildings(X1, Y1) Is Nothing Then
                                        UnitsBuildings(X1, Y1) = New List(Of VirtuelUnit)
                                        UnitsBuildings(X1, Y1).Add(VE)
                                    Else
                                        UnitsBuildings(X1, Y1).Add(VE)
                                    End If
                                End If
                            Next
                        Next
                    End If
                End If
            Next
        End Sub
        Public Sub UnitDestroyed(ByVal X As Integer, ByVal Y As Integer)
            If UnitsBuildings(X, Y) IsNot Nothing Then
                For Each E In UnitsBuildings(X, Y)
                    If E.X = X And E.Y = Y Then
                        For X1 = 0 To Objektverwalter.Spielfeld.Breite - 1
                            For Y1 = 0 To Objektverwalter.Spielfeld.Höhe - 1
                                For I = 0 To UnitsBuildings(X, Y).Count - 1
                                    If UnitsBuildings(X, Y)(I).ThisID = E.ThisID Then
                                        UnitsBuildings(X, Y).RemoveAt(I)
                                        Exit For
                                    End If
                                Next
                            Next
                        Next
                        Exit For
                    End If
                Next
            End If
            UpdateField(X, Y)
        End Sub
        Public Sub DidMove(ByVal StartPoint As Point, ByVal EndPoint As Point, ByVal Target As Point)
            Dim UpdateList As New List(Of VirtuelUnit)
            For Each VE In UnitsBuildings(StartPoint.X, StartPoint.Y)
                If VE.X = StartPoint.X Then
                    If VE.Y = StartPoint.Y Then
                        VE.X = EndPoint.X
                        VE.Y = EndPoint.Y
                        UpdateList.Add(VE)
                        Exit For
                    End If
                End If
            Next
            Dim L As ObjektLandschaft
            If Objektverwalter.Spielfeld.OnMap(Target) Then
                Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(Target.X, Target.Y, Schlachtfeld).Gebäude
                Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(Target.X, Target.Y, Schlachtfeld)
                If E Is Nothing Then
                    If G Is Nothing Then
                        UnitDestroyed(Target.X, Target.Y)
                        L = Objektverwalter.Spielfeld.Landschaften(Target.X, Target.Y, Schlachtfeld)
                        While L IsNot Nothing
                            For Each VE In UnitsBuildings(L.KooX, L.KooY)
                                For I = 0 To UpdateList.Count - 1
                                    If UpdateList(I).ThisID = VE.ThisID Then
                                        Exit For
                                    End If
                                    If I = UpdateList.Count - 1 Then
                                        UpdateList.Add(VE)
                                    End If
                                Next
                            Next
                            L = Wegsuchsystem.getFeldRundrum(Target.X, Target.Y, Schlachtfeld, 1, 1, L, Objektverwalter.Spielfeld)
                        End While
                    End If
                End If
            End If
            L = Objektverwalter.Spielfeld.Landschaften(StartPoint.X, StartPoint.Y, Schlachtfeld)
            While L IsNot Nothing
                For Each VE In UnitsBuildings(L.KooX, L.KooY)
                    For I = 0 To UpdateList.Count - 1
                        If UpdateList(I).ThisID = VE.ThisID Then
                            Exit For
                        End If
                        If I = UpdateList.Count - 1 Then
                            UpdateList.Add(VE)
                        End If
                    Next
                Next
                L = Wegsuchsystem.getFeldRundrum(Target.X, Target.Y, Schlachtfeld, 1, 1, L, Objektverwalter.Spielfeld)
            End While
            If StartPoint <> EndPoint Then
                L = Objektverwalter.Spielfeld.Landschaften(Target.X, Target.Y, Schlachtfeld)
                While L IsNot Nothing
                    For Each VE In UnitsBuildings(L.KooX, L.KooY)
                        For I = 0 To UpdateList.Count - 1
                            If UpdateList(I).ThisID = VE.ThisID Then
                                Exit For
                            End If
                            If I = UpdateList.Count - 1 Then
                                UpdateList.Add(VE)
                            End If
                        Next
                    Next
                    L = Wegsuchsystem.getFeldRundrum(Target.X, Target.Y, Schlachtfeld, 1, 1, L, Objektverwalter.Spielfeld)
                End While
            End If
        End Sub
        ''' <summary>
        ''' Calculates the Counter-Damage on this Field
        ''' (Including Structures and Allied Units
        ''' </summary>
        ''' <param name="Unit"></param>
        ''' <param name="NewX"></param>
        ''' <param name="NewY"></param>
        ''' <param name="X"></param>
        ''' <param name="Y"></param>
        ''' <returns></returns>
        ''' <remarks></remarks>
        Public Function GetPotentialCounterDamage(ByVal Unit As ObjektEinheit, ByVal NewX As Integer, ByVal NewY As Integer, ByVal X As Integer, ByVal Y As Integer) As Integer
            If UnitsBuildings(X, Y) IsNot Nothing Then
                Dim Team As Char = Unit.GetSpieler.Team
                Dim CounterDamage As Integer = 0
                Dim TRate As Single = Unit.GetSpieler.Teurungsrate(Unit.EinheitenID, X, Y)
                Dim CounterUnits As New List(Of Integer)
                For Each Enemy In UnitsBuildings(X, Y)
                    If Not CounterUnits.Contains(Enemy.ThisID) Then
                        If Enemy.Team <> Team Then
                            If Enemy.Type = VirtuelUnit.Typs.Unit Then
                                'We search all Enemies
                                Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(Enemy.X, Enemy.Y, Schlachtfeld)
                                If E.Bewegungsart = MovementSorts.Höllium.ToString Then
                                    'Hölliums kill us!
                                    CounterDamage += Unit.Kosten * TRate * Unit.Leben / 100
                                Else
                                    CounterDamage += CalculateDamage(E, Unit, New Point(X, Y), New Point(NewX, NewY))
                                End If
                                CounterUnits.Add(Enemy.ThisID)
                            End If
                        Else
                            Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(Enemy.X, Enemy.Y, Schlachtfeld).Gebäude
                            If G IsNot Nothing Then
                                If G.Schaden > 0 Then
                                    Dim Damage As Single = G.Schaden * 10
                                    If Damage > Unit.Leben Then Damage = Unit.Leben
                                    CounterDamage += Unit.Kosten * TRate * Damage / 100
                                    CounterUnits.Add(Enemy.ThisID)
                                End If
                            End If
                        End If
                    End If
                Next
                Dim L As ObjektLandschaft = Wegsuchsystem.getFeldRundrum(X, Y, Schlachtfeld, 1, 1, Objektverwalter.Spielfeld.Landschaften(X, Y, Schlachtfeld), Objektverwalter.Spielfeld)
                While L IsNot Nothing
                    If UnitsBuildings(X, Y) IsNot Nothing Then
                        For Each Allied In UnitsBuildings(X, Y)
                            If Not CounterUnits.Contains(Allied.ThisID) Then
                                If Allied.Team = Team Then
                                    If Not (Allied.X = Unit.X And Allied.Y = Unit.Y) Then
                                        'An Allied Unit not this Unit
                                        If Allied.Type = VirtuelUnit.Typs.Unit Then
                                            Dim E As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(Allied.X, Allied.Y, Schlachtfeld)
                                            If E IsNot Nothing Then
                                                If Not E.HasNoWeapons Then
                                                    If E.HatsichBewegt Or E.Spieler <> Unit.Spieler Then
                                                        CounterDamage -= E.Kosten * E.GetSpieler.Teurungsrate(E.EinheitenID, E.X, E.Y) * E.Leben / 100 / OwnDeffence
                                                        CounterUnits.Add(Allied.ThisID)
                                                    End If
                                                End If
                                            End If
                                        Else
                                            Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(Allied.X, Allied.Y, Schlachtfeld).Gebäude
                                            If G.Schaden < 0 Then
                                                If L.KooX = NewX And L.KooY = NewY Then
                                                    If G.Spieler = Unit.Spieler Then
                                                        'Own Healing Structure
                                                        CounterDamage += TRate * Unit.Kosten * G.Schaden / 10
                                                        CounterUnits.Add(Allied.ThisID)
                                                    End If
                                                End If
                                            Else 'Allied Damage Structure
                                                If G.Angriff = ObjektGebäude.Angriffe.Strahl Then
                                                    If L.KooX = NewX And L.KooY = NewY Then
                                                        'Laser ignore Allied Units include this negativ into our Calculation
                                                        Dim Damage As Single = G.Schaden * 10
                                                        If Damage > Unit.Leben Then Damage = Unit.Leben
                                                        CounterDamage += Unit.Kosten * TRate * Damage / 100
                                                        CounterUnits.Add(Allied.ThisID)
                                                    End If
                                                Else
                                                    'Has a Positive Effect.
                                                    CounterDamage -= G.Schaden * TRate * Unit.Leben / 100 * Unit.Kosten / OwnDeffence
                                                    CounterUnits.Add(Allied.ThisID)
                                                End If
                                            End If
                                        End If
                                    End If
                                End If
                            End If
                        Next
                    End If
                    L = Wegsuchsystem.getFeldRundrum(X, Y, Schlachtfeld, 1, 1, L, Objektverwalter.Spielfeld)
                End While
            Return CounterDamage
            Else
            Return 0
            End If
        End Function
        ''' <summary>
        ''' Rechnet aus, wieviel Geldschaden entsteht. Das heißt die Differenz. Den Schaden, welchen der Angreifer nimmt Minus den Schaden, den der Verteidiger nimmt. Das Leben, was die beiden Einheiten dann noch vermutlich haben, wird unter Virtuelles Leben gespeichert!
        ''' </summary>
        ''' <param name="Angreifer">Der Angreifer</param>
        ''' <param name="AX">Angreifer KooX</param>
        ''' <param name="AY">Angreifer KooY</param>
        ''' <param name="Verteidiger">Der Verteidiger</param>
        ''' <param name="VX">Verteidiger KooX</param>
        ''' <param name="VY">Verteidiger KooY</param>
        ''' <returns>Stelle 0:Schaden; Stelle 2: >0 Gegner zerstört oder 0> Feind hat überlebt!</returns>
        ''' <remarks></remarks>
        Public Shared Function CalculatePotentielleGeldVerluste(ByVal Angreifer As ObjektEinheit, ByVal AX As Integer, ByVal AY As Integer, ByVal Verteidiger As ObjektEinheit, ByVal VX As Integer, ByVal VY As Integer) As Integer()
            Dim ATKLeben As Single = Angreifer.Leben
            Dim DefLeben As Single = Verteidiger.Leben
            Dim VerursachterSchaden() As Single = Objektverwalter.Schadensberechnung(Angreifer, AX, AY, VX, VY, ATKLeben, DefLeben, True, Angreifer.GetSpieler.GetGlückPech(AX, AY).X * Objektverwalter.Spielfeld.KI.Glücksfaktor, Verteidiger, True)
            Dim BesetzungsBonus As Single = calculateBesetzungsbonus(Verteidiger, DefLeben)
            If DefLeben <= 0 Then 'Das vernichten einer Einheit bringt einen kleinen Bonus!
                DefLeben = 0
                Dim KVerteidiger As Integer = (Verteidiger.Kosten * Verteidiger.GetSpieler.Teurungsrate(Verteidiger, VX, VY)) * ((Verteidiger.Leben - DefLeben) / 100)
                Return New Integer() {-KVerteidiger * 2 * BesetzungsBonus, 1}
            ElseIf Distance(New Point(AX, AY), New Point(VX, VY)) > 1 Then
                Dim KVerteidiger As Integer = (Verteidiger.Kosten * Verteidiger.GetSpieler.Teurungsrate(Verteidiger, VX, VY)) * ((Verteidiger.Leben - DefLeben) / 100)
                Return New Integer() {-KVerteidiger * BesetzungsBonus, -1}
            Else
                Dim GegenSchaden() As Single = Objektverwalter.Schadensberechnung(Verteidiger, VX, VY, AX, AY, DefLeben, ATKLeben, True, Verteidiger.GetSpieler.GetGlückPech(VX, VY).X * Objektverwalter.Spielfeld.KI.Glücksfaktor, Angreifer)
                If ATKLeben < 0 Then ATKLeben = 0
                Dim KVerteidiger As Integer = (Verteidiger.Kosten * Verteidiger.GetSpieler.Teurungsrate(Verteidiger, VX, VY)) * ((Verteidiger.Leben - DefLeben) / 100)
                Dim KAngreifer As Integer = (Angreifer.Kosten * Angreifer.GetSpieler.Teurungsrate(Angreifer, AX, AY)) * ((Angreifer.Leben - ATKLeben) / 100)
                Return New Integer() {KAngreifer - KVerteidiger * BesetzungsBonus, -1}
            End If
        End Function
        Private Shared Function calculateBesetzungsbonus(ByVal Besetzer As ObjektEinheit, ByVal DefNeuLeben As Integer) As Single
            Dim Wert As Single = 1
            Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(Besetzer.X, Besetzer.Y, Besetzer.GetMap).Gebäude
            If G Is Nothing Then Return 1
            If G.GetSpieler.Team = Besetzer.GetSpieler.Team Then Return 1
            If Not Besetzer.KannBesetzen Then Return 1
            Dim RestP As Integer = G.Besetzung
            Dim L1 As Integer = Besetzer.getKP
            Dim L2 As Integer = getKP(DefNeuLeben)
            Dim R1 As Integer = Math.Round(RestP / L1, System.MidpointRounding.AwayFromZero)
            If L2 <= 0 Then
                If R1 > 0 Then
                    Wert = 1 + (21 - R1) / R1
                Else
                    Wert = 22
                End If
            Else
                Dim R2 As Integer = Math.Round(RestP / L2, System.MidpointRounding.AwayFromZero)
                If R1 < R2 Then Return 0.8
                If R1 = R2 And R1 < 2 Then Return 1
                Wert = 1 + (R2 - R1) / R1
            End If
            If Wert > 6 Then
                Return Wert / 2 + 3
            Else
                Return Wert
            End If
        End Function
        Public Function CalculateDamage(ByVal Attacker As ObjektEinheit, ByVal Deffender As ObjektEinheit, ByVal ATKPosition As Point, ByVal DefPosition As Point) As Integer
            Dim ATKLeben As Single = Attacker.Leben
            Dim DefLeben As Single = Deffender.Leben
            Dim VerursachterSchaden() As Single = Objektverwalter.Schadensberechnung(Attacker, ATKPosition.X, ATKPosition.Y, DefPosition.X, DefPosition.Y, ATKLeben, DefLeben, True, Attacker.GetSpieler.GetGlückPech(ATKPosition.X, ATKPosition.Y).X * Objektverwalter.Spielfeld.KI.Glücksfaktor, Deffender)
            If VerursachterSchaden(0) > Ignorierschaden Then 'Bei so wenig Gegenschaden werden wir nicht angegriffen!
                If DefLeben < 0 Then DefLeben = 0
                Dim GegenSchaden() As Single = Objektverwalter.Schadensberechnung(Deffender, DefPosition.X, DefPosition.Y, ATKPosition.X, ATKPosition.Y, DefLeben, ATKLeben, True, Deffender.GetSpieler.GetGlückPech(DefPosition.X, DefPosition.Y).X * Objektverwalter.Spielfeld.KI.Glücksfaktor, Attacker)
                If ATKLeben < 0 Then ATKLeben = 0
                Dim KEinheit As Integer = (Deffender.Kosten * Deffender.GetSpieler.Teurungsrate(Deffender, DefPosition.X, DefPosition.Y)) * ((Deffender.Leben - DefLeben) / 100)
                Dim KUnit As Integer = (Attacker.Kosten * Attacker.GetSpieler.Teurungsrate(Attacker, ATKPosition.X, ATKPosition.Y)) * ((Attacker.Leben - ATKLeben) / 100)
                Return KEinheit - KUnit
            Else
                Return 0
            End If
        End Function
    End Class
   
End Class
